SMX II 游戏架构与原理简介

2014-09-19

上一篇文章里, 我宣布了smx2终止开发的消息. 为了给新项目做好准备, 我对现有项目结构进行了一番疏理. 现将项目的结构及原理发表出来与大家分享, 希望能让感兴趣的朋友有所收获.

SMX II 的总体结构

下图是smx2的总体结构图, 包含了游戏项目中最重要的模块. 其中底层模块实现最基础的功能, 为上层模块提供支持. 而上层模块则使用下层模块的服务, 以完成更高级的功能.

处于最顶层的用户界面 (GUI) 将游戏效果实时呈现给玩家.
下面的核心框架 (Core Framework) 则用于联系用户界面及底层服务, 并驱动游戏运行.
游戏性基础系统 (Gameplay Foundations) 定义了游戏规则, 包含固定的游戏逻辑 (Game Logic) 及用于运行特殊关卡逻辑的脚本系统 (Script System).
游戏对象模型 (Models) 定义了游戏中的各种元素, 如游戏单位, 玩家角色, 场景, 环境等等.
数据加载组件 (File IO) 及容器组件 (Containers) 则分别用于加载 / 管理关卡场景和游戏资源.
最底层的引擎组件 (Engines)包含了四个子系统, 分别负责图形渲染, 音乐 / 音效播放, 物理运算, 键盘输入处理的工作.

深入组件原理

介绍了游戏的整体结构之后, 以下我将从底层引擎开始, 逐一分析各个组件, 让大家了解到smx是如何逐步构建出来的.

1 引擎组件 (Engines)

1.1 图形渲染引擎 (Grahpics Engine)

图形引擎负责接收绘制请求, 根据请求中提供的信息决定绘制策略, 并调用操作系统提供的绘图接口完成绘制操作.

举个例子, 图形引擎收到一个 "在场景(16, 16) - (128, 48)的范围内绘制单位A" 的请求,

继而它发现单位A是一个简单的Tile单位, 所以直接在要求的范围内铺满这个Tile的图像, 绘制后得到如下效果:

另一个例子, 图形引擎又收到一个 "在场景(16, 16) - (128, 48)的范围内绘制地面A" 的请求,

这时它发现地面A并不是Tile单位, 不能直接平铺(拉伸图像当然也是不可取的, 具体效果各位自己想象), 故继续查看单位模型信息, 得知地面A包含了3*3个小块(以下用(1, 1), (1, 2), (1, 3) ... (3, 3)表示), 且要求使用"扩展模式"来绘制.

"扩展模式"的绘制策略:(假设要求绘制的范围足够大)
  1. 将四个角块((1, 1), (1, 3), (3, 1), (3, 3))绘制到区域的四个角落.
  2. 将四个边块((1, 2), (2, 1), (2, 3), (3, 2))平铺到区域的四个边缘.
  3. 将中心块(2, 2)平铺到区域的中间部分.

由于实际请求范围高度上较小, 引擎优先选择地面的顶边及底边来组合, 并对边块进行扩展,

最终得到了如下效果:

支持了静态单位以后, 动态单位自然也不在话下.
首先我们需要扩展游戏单位模型, 记录下单位的关键帧数目以及每一帧的图像. 例如问号方块有4个关键帧, 图像信息为.
引擎收到绘制请求时先获取游戏对象当前显示的帧数, 计算出下一帧, 到模型中取出图像进行n等分(n为关键帧数目), 再提取出下一帧对应图像, 最后按照静态单位的方式进行绘制. 静态图像的连续切换便产生了动画效果.

当然, 图形引擎还负责了很多工作, 如剔除不可见的区域以提高渲染效率, 处理遮罩运算以支持透明效果, 支持双缓冲以避免画面闪烁等等, 本文作为入门文章便不再详细展开.

待续...